/**************************************************************************//**
 * @item     CosyOS-III 例程（服务应用）
 * @file     event_semaph.c
 * @brief    事件同步_计数信号量
 * @details  通过计数信号量的{给予->获取}，实现中断对任务的事件同步。
 * @note     事件处理线程（task_1）中，可以实现超时处理机制。
 * @note     计数信号量，是唯一能够实现并发事件同步的手段。
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2025.10.21
 ******************************************************************************/

/*-------------------------------------------------------*
 | 服务                | 描述                            |
 |---------------------+---------------------------------|
 | uTakeSem(sem, tick) | 任务中获取计数信号量            |
 |---------------------+---------------------------------|
 | iGiveSem(sem)       | 中断中给予计数信号量 - FIFO服务 |
 *-------------------------------------------------------*/

#if 1 /* 编译开关 */

#include "CosyOS.H"

uCreateSem(sem_1, 0, ~0); // 创建计数信号量，用于事件同步，初值为0（任务中首次获取时不能立即成功获取而阻塞）

/**
 * \brief    task_1
 * \details  协作处理更为耗时的事务。
 */
uCreateTask(task_1, 1, 384, 0, 0)
{
    while(1){
        if(uTakeSem(sem_1, xTick_ms(500))){ // 如果超时时间为~0，任务将进入无尽的阻塞（直到成功获取后转为就绪），不再支持超时处理
            /* 处理事件 开始 */
            
            /* 处理事件 结束 */
        }
        else{
            /* 超时处理 开始 */
            
            /* 超时处理 结束 */
        }
    }
}

/**
 * \brief    某中断
 * \details  先对事件做必要的紧急处理，再同步至task_1 做后续处理。
 */
void XXXx_IRQHandler(void) // interrupt XXXx_VECTOR
{
    /* 清中断标志位 开始 */
    
    /* 清中断标志位 结束 */
    /* 紧急处理事件 开始 */
    
    /* 紧急处理事件 结束 */
    /* 同步至task_1 开始 */// 仅支持 FIFO服务，不支持 FLAG服务
    /* 采用 FIFO服务 */
    iGiveSem(sem_1);       // 给予sem_1
    /* 同步至task_1 结束 */
}

/** 启动钩子 */
void start_hook(void)
{
    uStartTask_Ready(task_1); // 启动task_1，初始状态为就绪状态
}

#endif
